package com.lmf.juc.Lock.case6;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * Java中创建线程的四种方式：
 *      （1）创建一个 Thread对象
 *      （2）实现一个 Runnable接口的实例对象，可以直接放到 Thread里面，并启动执行。
 *      （3）实现一个 Callable接口的实例对象，需需要在 FutureTask包装一下，才可以放到Thread里面去，启动执行
 *      （4）利用线程池
 */
public class ThreadCreateMethod {
    public static void main(String[] args) throws Exception {
        /**
         * 利用Thread，直接创建一个线程
         */
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "线程：由Thread构建");
        },"AA").start();
        /**
         * Runnable接口的实例对象，可以直接放到 Thread里面，并启动执行。
         */
        MyThread thread1 = new MyThread();
        new Thread(thread1,"BB").start();

        /**
         * （1）Callable接口的实例对象，需要在 FutureTask包装一下，才可以放到Thread里面去，启动执行
         * 注意：Runnable接口的实例对象，也可以放到 FutureTask里面包装一下，再放到Thread里面执行
         *
         * FutureTask类常用方法：<Integer>引入一个类型，当作FutureTask中，get方法返回值类型
         * （1）get()获取结果
         * （2）isDone()判断是否计算结束
         */
        MyThread2 thread2 = new MyThread2();
        FutureTask<Integer> futureTask = new FutureTask<>(thread2);
        new Thread(futureTask,"CC").start();
        System.out.println("FutureTask中，get方法返回值" + futureTask.get());
    }
}

/**
 * 实现一个 Runnable接口的实例对象
 */
class MyThread implements Runnable{

    //Runnable接口实现run方法
    @Override
    public void run() {
        System.out.println("利用Runnable接口创建线程：" + Thread.currentThread().getName());
    }
}

/**
 * 实现一个 Callable接口的实例对象：<Integer>引入一个类型，当作call方法返回值类型
 */
class MyThread2 implements Callable<Integer> {

    //Callable接口，实现call方法，必须有返回值
    @Override
    public Integer call() throws Exception {
        System.out.println("利用Callable接口创建线程：" + Thread.currentThread().getName());
        return 200;
    }
}